Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

feature/settings/src/main/kotlin/org/meshtastic/feature/settings/debugging/DebugViewModel.kt 1c3784235e7e20ed88e054097d2e7addbff92dc3 (1c378423) Text, 19.17 KB

T8b949e/*
* Copyright (c) 2025 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

Tff7b72package T7ee787org.meshtastic.feature.settings.debugging

Tff7b72import T7ee787androidx.compose.runtime.Immutable
Tff7b72import T7ee787androidx.lifecycle.ViewModel
Tff7b72import T7ee787androidx.lifecycle.viewModelScope
Tff7b72import T7ee787com.google.protobuf.InvalidProtocolBufferException
Tff7b72import T7ee787dagger.hilt.android.lifecycle.HiltViewModel
Tff7b72import T7ee787kotlinx.collections.immutable.ImmutableList
Tff7b72import T7ee787kotlinx.collections.immutable.persistentListOf
Tff7b72import T7ee787kotlinx.collections.immutable.toImmutableList
Tff7b72import T7ee787kotlinx.coroutines.Dispatchers
Tff7b72import T7ee787kotlinx.coroutines.flow.MutableStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.StateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.asStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.combine
Tff7b72import T7ee787kotlinx.coroutines.flow.map
Tff7b72import T7ee787kotlinx.coroutines.launch
Tff7b72import T7ee787org.meshtastic.core.data.repository.MeshLogRepository
Tff7b72import T7ee787org.meshtastic.core.data.repository.NodeRepository
Tff7b72import T7ee787org.meshtastic.core.database.entity.MeshLog
Tff7b72import T7ee787org.meshtastic.core.database.entity.Packet
Tff7b72import T7ee787org.meshtastic.core.model.getTracerouteResponse
Tff7b72import T7ee787org.meshtastic.core.ui.viewmodel.stateInWhileSubscribed
Tff7b72import T7ee787org.meshtastic.proto.AdminProtos
Tff7b72import T7ee787org.meshtastic.proto.MeshProtos
Tff7b72import T7ee787org.meshtastic.proto.PaxcountProtos
Tff7b72import T7ee787org.meshtastic.proto.Portnums.PortNum
Tff7b72import T7ee787org.meshtastic.proto.StoreAndForwardProtos
Tff7b72import T7ee787org.meshtastic.proto.TelemetryProtos
Tff7b72import T7ee787timber.log.Timber
Tff7b72import T7ee787java.text.DateFormat
Tff7b72import T7ee787java.util.Date
Tff7b72import T7ee787java.util.Locale
Tff7b72import T7ee787javax.inject.Inject

Tff7b72data Tff7b72class T56d364SearchMatchTb4b4b4(Tff7b72val Te6edf3logIndexTb4b4b4: Tffa657IntTb4b4b4, Tff7b72val Te6edf3startTb4b4b4: Tffa657IntTb4b4b4, Tff7b72val Te6edf3endTb4b4b4: Tffa657IntTb4b4b4, Tff7b72val Te6edf3fieldTb4b4b4: Tffa657StringTb4b4b4)

Tff7b72data Tff7b72class T56d364SearchStateTb4b4b4(
Tff7b72val Te6edf3searchTextTb4b4b4: Tffa657String Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Tff7b72val Te6edf3currentMatchIndexTb4b4b4: Tffa657Int Tff7b72= Tff7b72-T79c0ff1Tb4b4b4,
Tff7b72val Te6edf3allMatchesTb4b4b4: Te6edf3ListTff7b72<Te6edf3SearchMatchTff7b72> Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4,
Tff7b72val Te6edf3hasMatchesTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Tb4b4b4)

T8b949e// --- Search and Filter Managers ---
Tff7b72class T56d364LogSearchManager Tb4b4b4{
Tff7b72data Tff7b72class T56d364SearchMatchTb4b4b4(Tff7b72val Te6edf3logIndexTb4b4b4: Tffa657IntTb4b4b4, Tff7b72val Te6edf3startTb4b4b4: Tffa657IntTb4b4b4, Tff7b72val Te6edf3endTb4b4b4: Tffa657IntTb4b4b4, Tff7b72val Te6edf3fieldTb4b4b4: Tffa657StringTb4b4b4)

Tff7b72data Tff7b72class T56d364SearchStateTb4b4b4(
Tff7b72val Te6edf3searchTextTb4b4b4: Tffa657String Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Tff7b72val Te6edf3currentMatchIndexTb4b4b4: Tffa657Int Tff7b72= Tff7b72-T79c0ff1Tb4b4b4,
Tff7b72val Te6edf3allMatchesTb4b4b4: Te6edf3ListTff7b72<Te6edf3SearchMatchTff7b72> Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4,
Tff7b72val Te6edf3hasMatchesTb4b4b4: Tffa657Boolean Tff7b72= Tff7b72falseTb4b4b4,
Tb4b4b4)

Tff7b72private Tff7b72val Te6edf3_searchText Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72val Te6edf3searchText Tff7b72= Te6edf3_searchTextTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72private Tff7b72val Te6edf3_currentMatchIndex Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Tff7b72-T79c0ff1Tb4b4b4)
Tff7b72val Te6edf3currentMatchIndex Tff7b72= Te6edf3_currentMatchIndexTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72private Tff7b72val Te6edf3_searchState Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Te6edf3SearchStateTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3searchState Tff7b72= Te6edf3_searchStateTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72fun Td2a8ffsetSearchTextTb4b4b4(Te6edf3textTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3_searchTextTb4b4b4.Te6edf3value Tff7b72= Te6edf3text
Te6edf3_currentMatchIndexTb4b4b4.Te6edf3value Tff7b72= Tff7b72-T79c0ff1
Tb4b4b4}

Tff7b72fun Td2a8ffgoToNextMatchTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3matches Tff7b72= Te6edf3_searchStateTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3allMatches
Tff7b72if Tb4b4b4(Te6edf3matchesTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3nextIndex Tff7b72= Tff7b72if Tb4b4b4(Te6edf3_currentMatchIndexTb4b4b4.Te6edf3value Tff7b72< Te6edf3matchesTb4b4b4.Te6edf3lastIndexTb4b4b4) Te6edf3_currentMatchIndexTb4b4b4.Te6edf3value Tff7b72+ T79c0ff1 Tff7b72else T79c0ff0
Te6edf3_currentMatchIndexTb4b4b4.Te6edf3value Tff7b72= Te6edf3nextIndex
Te6edf3_searchStateTb4b4b4.Te6edf3value Tff7b72= Te6edf3_searchStateTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3currentMatchIndex Tff7b72= Te6edf3nextIndexTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffgoToPreviousMatchTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3matches Tff7b72= Te6edf3_searchStateTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3allMatches
Tff7b72if Tb4b4b4(Te6edf3matchesTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3prevIndex Tff7b72= Tff7b72if Tb4b4b4(Te6edf3_currentMatchIndexTb4b4b4.Te6edf3value Tff7b72> T79c0ff0Tb4b4b4) Te6edf3_currentMatchIndexTb4b4b4.Te6edf3value Tff7b72- T79c0ff1 Tff7b72else Te6edf3matchesTb4b4b4.Te6edf3lastIndex
Te6edf3_currentMatchIndexTb4b4b4.Te6edf3value Tff7b72= Te6edf3prevIndex
Te6edf3_searchStateTb4b4b4.Te6edf3value Tff7b72= Te6edf3_searchStateTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3currentMatchIndex Tff7b72= Te6edf3prevIndexTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffclearSearchTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3setSearchTextTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tb4b4b4}

Tff7b72fun Td2a8ffupdateMatchesTb4b4b4(Te6edf3searchTextTb4b4b4: Tffa657StringTb4b4b4, Te6edf3filteredLogsTb4b4b4: Te6edf3ListTff7b72<Te6edf3DebugViewModelTb4b4b4.Te6edf3UiMeshLogTff7b72>Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3matches Tff7b72= Te6edf3findSearchMatchesTb4b4b4(Te6edf3searchTextTb4b4b4, Te6edf3filteredLogsTb4b4b4)
Tff7b72val Te6edf3hasMatches Tff7b72= Te6edf3matchesTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)
Te6edf3_searchStateTb4b4b4.Te6edf3value Tff7b72=
Te6edf3_searchStateTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3copyTb4b4b4(
Te6edf3searchText Tff7b72= Te6edf3searchTextTb4b4b4,
Te6edf3allMatches Tff7b72= Te6edf3matchesTb4b4b4,
Te6edf3hasMatches Tff7b72= Te6edf3hasMatchesTb4b4b4,
Te6edf3currentMatchIndex Tff7b72= Tff7b72if Tb4b4b4(Te6edf3hasMatchesTb4b4b4) Te6edf3_currentMatchIndexTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3coerceInTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3matchesTb4b4b4.Te6edf3lastIndexTb4b4b4) Tff7b72else Tff7b72-T79c0ff1Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

Tff7b72fun Td2a8fffindSearchMatchesTb4b4b4(Te6edf3searchTextTb4b4b4: Tffa657StringTb4b4b4, Te6edf3filteredLogsTb4b4b4: Te6edf3ListTff7b72<Te6edf3DebugViewModelTb4b4b4.Te6edf3UiMeshLogTff7b72>Tb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3SearchMatchTff7b72> Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3searchTextTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3emptyListTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72return Te6edf3filteredLogs
Tb4b4b4.Te6edf3flatMapIndexed Tb4b4b4{ Te6edf3logIndexTb4b4b4, Te6edf3log Tff7b72-Tff7b72>
Te6edf3searchTextTb4b4b4.Te6edf3splitTb4b4b4(Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3flatMap Tb4b4b4{ Te6edf3term Tff7b72-Tff7b72>
Tff7b72val Te6edf3escapedTerm Tff7b72= Te6edf3RegexTb4b4b4.Te6edf3escapeTb4b4b4(Te6edf3termTb4b4b4)
Tff7b72val Te6edf3regex Tff7b72= Te6edf3escapedTermTb4b4b4.Te6edf3toRegexTb4b4b4(Te6edf3RegexOptionTb4b4b4.Te6edf3IGNORE_CASETb4b4b4)
Tff7b72val Te6edf3messageMatches Tff7b72=
Te6edf3regexTb4b4b4.Te6edf3findAllTb4b4b4(Te6edf3logTb4b4b4.Te6edf3logMessageTb4b4b4)Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3match Tff7b72-Tff7b72>
Te6edf3SearchMatchTb4b4b4(Te6edf3logIndexTb4b4b4, Te6edf3matchTb4b4b4.Te6edf3rangeTb4b4b4.Te6edf3firstTb4b4b4, Te6edf3matchTb4b4b4.Te6edf3rangeTb4b4b4.Te6edf3lastTb4b4b4, Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3typeMatches Tff7b72=
Te6edf3regexTb4b4b4.Te6edf3findAllTb4b4b4(Te6edf3logTb4b4b4.Te6edf3messageTypeTb4b4b4)Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3match Tff7b72-Tff7b72>
Te6edf3SearchMatchTb4b4b4(Te6edf3logIndexTb4b4b4, Te6edf3matchTb4b4b4.Te6edf3rangeTb4b4b4.Te6edf3firstTb4b4b4, Te6edf3matchTb4b4b4.Te6edf3rangeTb4b4b4.Te6edf3lastTb4b4b4, Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3dateMatches Tff7b72=
Te6edf3regexTb4b4b4.Te6edf3findAllTb4b4b4(Te6edf3logTb4b4b4.Te6edf3formattedReceivedDateTb4b4b4)Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3match Tff7b72-Tff7b72>
Te6edf3SearchMatchTb4b4b4(Te6edf3logIndexTb4b4b4, Te6edf3matchTb4b4b4.Te6edf3rangeTb4b4b4.Te6edf3firstTb4b4b4, Te6edf3matchTb4b4b4.Te6edf3rangeTb4b4b4.Te6edf3lastTb4b4b4, Ta5d6ff"Ta5d6ffdateTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3decodedPayloadMatches Tff7b72=
Te6edf3logTb4b4b4.Te6edf3decodedPayloadTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3decoded Tff7b72-Tff7b72>
Te6edf3regexTb4b4b4.Te6edf3findAllTb4b4b4(Te6edf3decodedTb4b4b4)Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3match Tff7b72-Tff7b72>
Te6edf3SearchMatchTb4b4b4(Te6edf3logIndexTb4b4b4, Te6edf3matchTb4b4b4.Te6edf3rangeTb4b4b4.Te6edf3firstTb4b4b4, Te6edf3matchTb4b4b4.Te6edf3rangeTb4b4b4.Te6edf3lastTb4b4b4, Ta5d6ff"Ta5d6ffdecodedPayloadTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4} Tff7b72?: Te6edf3emptySequenceTb4b4b4(Tb4b4b4)
Te6edf3messageMatches Tff7b72+ Te6edf3typeMatches Tff7b72+ Te6edf3dateMatches Tff7b72+ Te6edf3decodedPayloadMatches
Tb4b4b4}
Tb4b4b4}
Tb4b4b4.Te6edf3sortedBy Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3start Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72class T56d364LogFilterManager Tb4b4b4{
Tff7b72private Tff7b72val Te6edf3_filterTexts Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3ListTff7b72<Tffa657StringTff7b72>Tff7b72>Tb4b4b4(Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3filterTexts Tff7b72= Te6edf3_filterTextsTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72private Tff7b72val Te6edf3_filteredLogs Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3DebugViewModelTb4b4b4.Te6edf3UiMeshLogTff7b72>Tff7b72>Tb4b4b4(Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3filteredLogs Tff7b72= Te6edf3_filteredLogsTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72fun Td2a8ffsetFilterTextsTb4b4b4(Te6edf3filtersTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4) Tb4b4b4{
Te6edf3_filterTextsTb4b4b4.Te6edf3value Tff7b72= Te6edf3filters
Tb4b4b4}

Tff7b72fun Td2a8ffupdateFilteredLogsTb4b4b4(Te6edf3logsTb4b4b4: Te6edf3ListTff7b72<Te6edf3DebugViewModelTb4b4b4.Te6edf3UiMeshLogTff7b72>Tb4b4b4) Tb4b4b4{
Te6edf3_filteredLogsTb4b4b4.Te6edf3value Tff7b72= Te6edf3logs
Tb4b4b4}

Tff7b72fun Td2a8fffilterLogsTb4b4b4(
Te6edf3logsTb4b4b4: Te6edf3ListTff7b72<Te6edf3DebugViewModelTb4b4b4.Te6edf3UiMeshLogTff7b72>Tb4b4b4,
Te6edf3filterTextsTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4,
Te6edf3filterModeTb4b4b4: Te6edf3FilterModeTb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3DebugViewModelTb4b4b4.Te6edf3UiMeshLogTff7b72> Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3filterTextsTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72return Te6edf3logs
Tff7b72return Te6edf3logsTb4b4b4.Te6edf3filter Tb4b4b4{ Te6edf3log Tff7b72-Tff7b72>
Tff7b72when Tb4b4b4(Te6edf3filterModeTb4b4b4) Tb4b4b4{
Te6edf3FilterModeTb4b4b4.Te6edf3OR Tff7b72-Tff7b72>
Te6edf3filterTextsTb4b4b4.Te6edf3any Tb4b4b4{ Te6edf3filterText Tff7b72-Tff7b72>
Te6edf3logTb4b4b4.Te6edf3logMessageTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3filterTextTb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4) Tff7b72|Tff7b72|
Te6edf3logTb4b4b4.Te6edf3messageTypeTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3filterTextTb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4) Tff7b72|Tff7b72|
Te6edf3logTb4b4b4.Te6edf3formattedReceivedDateTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3filterTextTb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4) Tff7b72|Tff7b72|
Tb4b4b4(Te6edf3logTb4b4b4.Te6edf3decodedPayloadTff7b72?.Te6edf3containsTb4b4b4(Te6edf3filterTextTb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4) Tff7b72=Tff7b72= Tff7b72trueTb4b4b4)
Tb4b4b4}

Te6edf3FilterModeTb4b4b4.Te6edf3AND Tff7b72-Tff7b72>
Te6edf3filterTextsTb4b4b4.Te6edf3all Tb4b4b4{ Te6edf3filterText Tff7b72-Tff7b72>
Te6edf3logTb4b4b4.Te6edf3logMessageTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3filterTextTb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4) Tff7b72|Tff7b72|
Te6edf3logTb4b4b4.Te6edf3messageTypeTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3filterTextTb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4) Tff7b72|Tff7b72|
Te6edf3logTb4b4b4.Te6edf3formattedReceivedDateTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3filterTextTb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4) Tff7b72|Tff7b72|
Tb4b4b4(Te6edf3logTb4b4b4.Te6edf3decodedPayloadTff7b72?.Te6edf3containsTb4b4b4(Te6edf3filterTextTb4b4b4, Te6edf3ignoreCase Tff7b72= Tff7b72trueTb4b4b4) Tff7b72=Tff7b72= Tff7b72trueTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72const Tff7b72val Te6edf3HEX_FORMAT Tff7b72= Ta5d6ff"Ta5d6ff%02xTa5d6ff"

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffTooManyFunctionsTa5d6ff"Tb4b4b4)
Tf0883e@HiltViewModel
Tff7b72class T56d364DebugViewModel
Tf0883e@Inject
Tff7b72constructorTb4b4b4(
Tff7b72private Tff7b72val Te6edf3meshLogRepositoryTb4b4b4: Te6edf3MeshLogRepositoryTb4b4b4,
Tff7b72private Tff7b72val Te6edf3nodeRepositoryTb4b4b4: Te6edf3NodeRepositoryTb4b4b4,
Tb4b4b4) Tb4b4b4: Te6edf3ViewModelTb4b4b4(Tb4b4b4) Tb4b4b4{

Tff7b72val Te6edf3meshLogTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ImmutableListTff7b72<Te6edf3UiMeshLogTff7b72>Tff7b72> Tff7b72=
Te6edf3meshLogRepositoryTb4b4b4.Te6edf3getAllLogsTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3mapTb4b4b4(Tff7b72::Te6edf3toUiStateTb4b4b4)Tb4b4b4.Te6edf3stateInWhileSubscribedTb4b4b4(Te6edf3initialValue Tff7b72= Te6edf3persistentListOfTb4b4b4(Tb4b4b4)Tb4b4b4)

T8b949e// --- Managers ---
Tff7b72val Te6edf3searchManager Tff7b72= Te6edf3LogSearchManagerTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3filterManager Tff7b72= Te6edf3LogFilterManagerTb4b4b4(Tb4b4b4)

Tff7b72val Te6edf3searchText
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3searchManagerTb4b4b4.Te6edf3searchText

Tff7b72val Te6edf3currentMatchIndex
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3searchManagerTb4b4b4.Te6edf3currentMatchIndex

Tff7b72val Te6edf3searchState
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3searchManagerTb4b4b4.Te6edf3searchState

Tff7b72val Te6edf3filterTexts
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3filterManagerTb4b4b4.Te6edf3filterTexts

Tff7b72val Te6edf3filteredLogs
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3filterManagerTb4b4b4.Te6edf3filteredLogs

Tff7b72private Tff7b72val Te6edf3_selectedLogId Tff7b72= Te6edf3MutableStateFlowTff7b72<Tffa657String?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4)
Tff7b72val Te6edf3selectedLogId Tff7b72= Te6edf3_selectedLogIdTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72fun Td2a8ffupdateFilteredLogsTb4b4b4(Te6edf3logsTb4b4b4: Te6edf3ListTff7b72<Te6edf3UiMeshLogTff7b72>Tb4b4b4) Tb4b4b4{
Te6edf3filterManagerTb4b4b4.Te6edf3updateFilteredLogsTb4b4b4(Te6edf3logsTb4b4b4)
Te6edf3searchManagerTb4b4b4.Te6edf3updateMatchesTb4b4b4(Te6edf3searchManagerTb4b4b4.Te6edf3searchTextTb4b4b4.Te6edf3valueTb4b4b4, Te6edf3logsTb4b4b4)
Tb4b4b4}

Tff7b72init Tb4b4b4{
Te6edf3TimberTb4b4b4.Te6edf3dTb4b4b4(Ta5d6ff"Ta5d6ffDebugViewModel createdTa5d6ff"Tb4b4b4)
Te6edf3viewModelScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Te6edf3combineTb4b4b4(Te6edf3searchManagerTb4b4b4.Te6edf3searchTextTb4b4b4, Te6edf3filterManagerTb4b4b4.Te6edf3filteredLogsTb4b4b4) Tb4b4b4{ Te6edf3searchTextTb4b4b4, Te6edf3logs Tff7b72-Tff7b72>
Te6edf3searchManagerTb4b4b4.Te6edf3findSearchMatchesTb4b4b4(Te6edf3searchTextTb4b4b4, Te6edf3logsTb4b4b4)
Tb4b4b4}
Tb4b4b4.Te6edf3collect Tb4b4b4{ Te6edf3matches Tff7b72-Tff7b72>
Te6edf3searchManagerTb4b4b4.Te6edf3updateMatchesTb4b4b4(Te6edf3searchManagerTb4b4b4.Te6edf3searchTextTb4b4b4.Te6edf3valueTb4b4b4, Te6edf3filterManagerTb4b4b4.Te6edf3filteredLogsTb4b4b4.Te6edf3valueTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72override Tff7b72fun Td2a8ffonClearedTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72superTb4b4b4.Te6edf3onClearedTb4b4b4(Tb4b4b4)
Te6edf3TimberTb4b4b4.Te6edf3dTb4b4b4(Ta5d6ff"Ta5d6ffDebugViewModel clearedTa5d6ff"Tb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8fftoUiStateTb4b4b4(Te6edf3databaseLogsTb4b4b4: Te6edf3ListTff7b72<Te6edf3MeshLogTff7b72>Tb4b4b4) Tff7b72= Te6edf3databaseLogs
Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3log Tff7b72-Tff7b72>
Te6edf3UiMeshLogTb4b4b4(
Te6edf3uuid Tff7b72= Te6edf3logTb4b4b4.Te6edf3uuidTb4b4b4,
Te6edf3messageType Tff7b72= Te6edf3logTb4b4b4.Te6edf3message_typeTb4b4b4,
Te6edf3formattedReceivedDate Tff7b72= Te6edf3TIME_FORMATTb4b4b4.Te6edf3formatTb4b4b4(Te6edf3logTb4b4b4.Te6edf3received_dateTb4b4b4)Tb4b4b4,
Te6edf3logMessage Tff7b72= Te6edf3annotateMeshLogMessageTb4b4b4(Te6edf3logTb4b4b4)Tb4b4b4,
Te6edf3decodedPayload Tff7b72= Te6edf3decodePayloadFromMeshLogTb4b4b4(Te6edf3logTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4.Te6edf3toImmutableListTb4b4b4(Tb4b4b4)

T8b949e/** Transform the input [MeshLog] by enhancing the raw message with annotations. */
Tff7b72private Tff7b72fun Td2a8ffannotateMeshLogMessageTb4b4b4(Te6edf3meshLogTb4b4b4: Te6edf3MeshLogTb4b4b4)Tb4b4b4: Tffa657String Tff7b72= Tff7b72when Tb4b4b4(Te6edf3meshLogTb4b4b4.Te6edf3message_typeTb4b4b4) Tb4b4b4{
Ta5d6ff"Ta5d6ffLogRecordTa5d6ff" Tff7b72-Tff7b72> Te6edf3meshLogTb4b4b4.Te6edf3fromRadioTb4b4b4.Te6edf3logRecordTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff"Ta5d6ff\\Ta5d6ffnTa5d6ff\"Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff\"Ta5d6ff"Tb4b4b4)
Ta5d6ff"Ta5d6ffPacketTa5d6ff" Tff7b72-Tff7b72> Te6edf3meshLogTb4b4b4.Te6edf3meshPacketTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3packet Tff7b72-Tff7b72> Te6edf3annotatePacketLogTb4b4b4(Te6edf3packetTb4b4b4) Tb4b4b4} Tff7b72?: Te6edf3meshLogTb4b4b4.Te6edf3raw_message
Ta5d6ff"Ta5d6ffNodeInfoTa5d6ff" Tff7b72-Tff7b72>
Te6edf3meshLogTb4b4b4.Te6edf3nodeInfoTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3nodeInfo Tff7b72-Tff7b72> Te6edf3annotateRawMessageTb4b4b4(Te6edf3meshLogTb4b4b4.Te6edf3raw_messageTb4b4b4, Te6edf3nodeInfoTb4b4b4.Te6edf3numTb4b4b4) Tb4b4b4}
Tff7b72?: Te6edf3meshLogTb4b4b4.Te6edf3raw_message
Ta5d6ff"Ta5d6ffMyNodeInfoTa5d6ff" Tff7b72-Tff7b72>
Te6edf3meshLogTb4b4b4.Te6edf3myNodeInfoTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3nodeInfo Tff7b72-Tff7b72> Te6edf3annotateRawMessageTb4b4b4(Te6edf3meshLogTb4b4b4.Te6edf3raw_messageTb4b4b4, Te6edf3nodeInfoTb4b4b4.Te6edf3myNodeNumTb4b4b4) Tb4b4b4}
Tff7b72?: Te6edf3meshLogTb4b4b4.Te6edf3raw_message
Tff7b72else Tff7b72-Tff7b72> Te6edf3meshLogTb4b4b4.Te6edf3raw_message
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffannotatePacketLogTb4b4b4(Te6edf3packetTb4b4b4: Te6edf3MeshProtosTb4b4b4.Te6edf3MeshPacketTb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72val Te6edf3builder Tff7b72= Te6edf3packetTb4b4b4.Te6edf3toBuilderTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3hasDecoded Tff7b72= Te6edf3builderTb4b4b4.Te6edf3hasDecodedTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3decoded Tff7b72= Tff7b72if Tb4b4b4(Te6edf3hasDecodedTb4b4b4) Te6edf3builderTb4b4b4.Te6edf3decoded Tff7b72else Tff7b72null
Tff7b72if Tb4b4b4(Te6edf3hasDecodedTb4b4b4) Te6edf3builderTb4b4b4.Te6edf3clearDecodedTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3baseText Tff7b72= Te6edf3builderTb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3trimEndTb4b4b4(Tb4b4b4)
Tff7b72var Te6edf3result Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3hasDecoded Tff7b72&Tff7b72& Te6edf3decoded Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3decodedText Tff7b72= Te6edf3decodedTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3trimEndTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3prependIndentTb4b4b4(Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)
Ta5d6ff"Tffd700$Te6edf3baseTextTa5d6ff\Ta5d6ffndecoded {Ta5d6ff\Ta5d6ffnTffd700$Te6edf3decodedTextTa5d6ff\Ta5d6ffn}Ta5d6ff"
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3baseText
Tb4b4b4}

Tff7b72val Te6edf3relayNode Tff7b72= Te6edf3packetTb4b4b4.Te6edf3relayNode
Tff7b72var Te6edf3relayNodeAnnotationTb4b4b4: Tffa657String? Tff7b72= Tff7b72null
Tff7b72val Te6edf3placeholder Tff7b72= Ta5d6ff"Ta5d6ff___RELAY_NODE___Ta5d6ff"

Tff7b72if Tb4b4b4(Te6edf3relayNode Tff7b72!Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3PacketTb4b4b4.Te6edf3getRelayNodeTb4b4b4(Te6edf3relayNodeTb4b4b4, Te6edf3nodeRepositoryTb4b4b4.Te6edf3nodeDBbyNumTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3valuesTb4b4b4.Te6edf3toListTb4b4b4(Tb4b4b4)Tb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3node Tff7b72-Tff7b72>
Tff7b72val Te6edf3relayId Tff7b72= Te6edf3nodeTb4b4b4.Te6edf3userTb4b4b4.Te6edf3id
Tff7b72val Te6edf3relayName Tff7b72= Te6edf3nodeTb4b4b4.Te6edf3userTb4b4b4.Te6edf3longName
Tff7b72val Te6edf3regex Tff7b72= Te6edf3RegexTb4b4b4(Ta5d6ff"""Ta5d6ff\Ta5d6ffbrelay_node: Tffd700${Te6edf3relayNodeTb4b4b4.Te6edf3toUIntTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff\Ta5d6ffbTa5d6ff"""Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3regexTb4b4b4.Te6edf3containsMatchInTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3relayNodeAnnotation Tff7b72= Ta5d6ff"Ta5d6ffrelay_node: Tffd700$Te6edf3relayNameTa5d6ff (Tffd700$Te6edf3relayIdTa5d6ff)Ta5d6ff"
Te6edf3result Tff7b72= Te6edf3regexTb4b4b4.Te6edf3replaceTb4b4b4(Te6edf3resultTb4b4b4, Te6edf3placeholderTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Te6edf3result Tff7b72= Te6edf3annotateRawMessageTb4b4b4(Te6edf3resultTb4b4b4, Te6edf3packetTb4b4b4.Te6edf3fromTb4b4b4, Te6edf3packetTb4b4b4.Te6edf3toTb4b4b4)

Tff7b72if Tb4b4b4(Te6edf3relayNodeAnnotation Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3result Tff7b72= Te6edf3resultTb4b4b4.Te6edf3replaceTb4b4b4(Te6edf3placeholderTb4b4b4, Te6edf3relayNodeAnnotationTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// Not annotated with name, so use hex.
Te6edf3result Tff7b72= Te6edf3annotateRawMessageTb4b4b4(Te6edf3resultTb4b4b4, Te6edf3relayNodeTb4b4b4)
Tb4b4b4}

Tff7b72return Te6edf3result
Tb4b4b4}

T8b949e/** Annotate the raw message string with the node IDs provided, in hex, if they are present. */
Tff7b72private Tff7b72fun Td2a8ffannotateRawMessageTb4b4b4(Te6edf3rawMessageTb4b4b4: Tffa657StringTb4b4b4, Tff7b72vararg Te6edf3nodeIdsTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72val Te6edf3msg Tff7b72= Te6edf3StringBuilderTb4b4b4(Te6edf3rawMessageTb4b4b4)
Tff7b72var Te6edf3mutated Tff7b72= Tff7b72false
Te6edf3nodeIdsTb4b4b4.Te6edf3toSetTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3nodeId Tff7b72-Tff7b72> Te6edf3mutated Tff7b72= Te6edf3mutated Te6edf3or Te6edf3msgTb4b4b4.Te6edf3annotateNodeIdTb4b4b4(Te6edf3nodeIdTb4b4b4) Tb4b4b4}
Tff7b72return Tff7b72if Tb4b4b4(Te6edf3mutatedTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3msgTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3rawMessage
Tb4b4b4}
Tb4b4b4}

T8b949e/** Look for a single node ID integer in the string and annotate it with the hex equivalent if found. */
Tff7b72private Tff7b72fun Te6edf3StringBuilderTb4b4b4.Td2a8ffannotateNodeIdTb4b4b4(Te6edf3nodeIdTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Tffa657Boolean Tb4b4b4{
Tff7b72val Te6edf3nodeIdStr Tff7b72= Te6edf3nodeIdTb4b4b4.Te6edf3toUIntTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)
T8b949e// Only match if whitespace before and after
Tff7b72val Te6edf3regex Tff7b72= Te6edf3RegexTb4b4b4(Ta5d6ff"""Ta5d6ff(?<=Ta5d6ff\Ta5d6ffs|^)Tffd700${Te6edf3RegexTb4b4b4.Te6edf3escapeTb4b4b4(Te6edf3nodeIdStrTb4b4b4)Tffd700}Ta5d6ff(?=Ta5d6ff\Ta5d6ffs|$Ta5d6ff)Ta5d6ff"""Tb4b4b4)
Te6edf3regexTb4b4b4.Te6edf3findTb4b4b4(Tff7b72thisTb4b4b4)Tff7b72?.Te6edf3let Tb4b4b4{ Te6edf3matchResult Tff7b72-Tff7b72>
Te6edf3matchResultTb4b4b4.Te6edf3groupValuesTb4b4b4.Te6edf3let Tb4b4b4{ Te6edf3_ Tff7b72-Tff7b72>
Te6edf3regexTb4b4b4.Te6edf3findAllTb4b4b4(Tff7b72thisTb4b4b4)Tb4b4b4.Te6edf3toListTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3asReversedTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3match Tff7b72-Tff7b72>
Tff7b72val Te6edf3idx Tff7b72= Te6edf3matchTb4b4b4.Te6edf3rangeTb4b4b4.Te6edf3last Tff7b72+ T79c0ff1
Te6edf3insertTb4b4b4(Te6edf3idxTb4b4b4, Ta5d6ff"Ta5d6ff (Tffd700${Te6edf3nodeIdTb4b4b4.Te6edf3asNodeIdTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72return Tff7b72true
Tb4b4b4}
Tff7b72return Tff7b72false
Tb4b4b4}

Tff7b72private Tff7b72fun Te6edf3IntTb4b4b4.Td2a8ffasNodeIdTb4b4b4(Tb4b4b4)Tb4b4b4: Tffa657String Tff7b72= Ta5d6ff"Ta5d6ff!%08xTa5d6ff"Tb4b4b4.Te6edf3formatTb4b4b4(Te6edf3LocaleTb4b4b4.Te6edf3getDefaultTb4b4b4(Tb4b4b4)Tb4b4b4, Tff7b72thisTb4b4b4)

Tff7b72fun Td2a8ffdeleteAllLogsTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3viewModelScopeTb4b4b4.Te6edf3launchTb4b4b4(Te6edf3DispatchersTb4b4b4.Te6edf3IOTb4b4b4) Tb4b4b4{ Te6edf3meshLogRepositoryTb4b4b4.Te6edf3deleteAllTb4b4b4(Tb4b4b4) Tb4b4b4}

Tf0883e@Immutable
Tff7b72data Tff7b72class T56d364UiMeshLogTb4b4b4(
Tff7b72val Te6edf3uuidTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3messageTypeTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3formattedReceivedDateTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3logMessageTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3decodedPayloadTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4)

Tff7b72companion Tff7b72object Tb4b4b4{
Tff7b72private Tff7b72val Te6edf3TIME_FORMAT Tff7b72= Te6edf3DateFormatTb4b4b4.Te6edf3getDateTimeInstanceTb4b4b4(Te6edf3DateFormatTb4b4b4.Te6edf3SHORTTb4b4b4, Te6edf3DateFormatTb4b4b4.Te6edf3MEDIUMTb4b4b4)
Tb4b4b4}

Tff7b72val Te6edf3presetFiltersTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3buildList Tb4b4b4{
T8b949e// Our address if available
Te6edf3nodeRepositoryTb4b4b4.Te6edf3myNodeInfoTb4b4b4.Te6edf3valueTff7b72?.Te6edf3myNodeNumTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3addTb4b4b4(Ta5d6ff"Ta5d6ff!%08xTa5d6ff"Tb4b4b4.Te6edf3formatTb4b4b4(Tffa657itTb4b4b4)Tb4b4b4) Tb4b4b4}
T8b949e// broadcast
Te6edf3addTb4b4b4(Ta5d6ff"Ta5d6ff!ffffffffTa5d6ff"Tb4b4b4)
T8b949e// decoded
Te6edf3addTb4b4b4(Ta5d6ff"Ta5d6ffdecodedTa5d6ff"Tb4b4b4)
T8b949e// today (locale-dependent short date format)
Te6edf3addTb4b4b4(Te6edf3DateFormatTb4b4b4.Te6edf3getDateInstanceTb4b4b4(Te6edf3DateFormatTb4b4b4.Te6edf3SHORTTb4b4b4)Tb4b4b4.Te6edf3formatTb4b4b4(Te6edf3DateTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
T8b949e// Each app name
Te6edf3addAllTb4b4b4(Te6edf3PortNumTb4b4b4.Te6edf3entriesTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3name Tb4b4b4}Tb4b4b4)
Tb4b4b4}

Tff7b72fun Td2a8ffsetSelectedLogIdTb4b4b4(Te6edf3idTb4b4b4: Tffa657String?Tb4b4b4) Tb4b4b4{
Te6edf3_selectedLogIdTb4b4b4.Te6edf3value Tff7b72= Te6edf3id
Tb4b4b4}

T8b949e/**
* Attempts to fully decode the payload of a MeshLog's MeshPacket using the appropriate protobuf definition, based
* on the portnum of the packet.
*
* For known portnums, the payload is parsed into its corresponding proto message and returned as a string. For text
* and alert messages, the payload is interpreted as UTF-8 text. For unknown portnums, the payload is shown as a hex
* string.
*
* @param log The MeshLog containing the packet and payload to decode.
* @return A human-readable string representation of the decoded payload, or an error message if decoding fails, or
* null if the log does not contain a decodable packet.
*/
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffdetekt:CyclomaticComplexMethodTa5d6ff"Tb4b4b4) T8b949e// large switch that detekt doesn't parse well.
Tff7b72private Tff7b72fun Td2a8ffdecodePayloadFromMeshLogTb4b4b4(Te6edf3logTb4b4b4: Te6edf3MeshLogTb4b4b4)Tb4b4b4: Tffa657String? Tb4b4b4{
Tff7b72var Te6edf3resultTb4b4b4: Tffa657String? Tff7b72= Tff7b72null
Tff7b72val Te6edf3packet Tff7b72= Te6edf3logTb4b4b4.Te6edf3meshPacket
Tff7b72if Tb4b4b4(Te6edf3packet Tff7b72=Tff7b72= Tff7b72null Tff7b72|Tff7b72| Tff7b72!Te6edf3packetTb4b4b4.Te6edf3hasDecodedTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3result Tff7b72= Tff7b72null
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72val Te6edf3portnum Tff7b72= Te6edf3packetTb4b4b4.Te6edf3decodedTb4b4b4.Te6edf3portnumValue
Tff7b72val Te6edf3payload Tff7b72= Te6edf3packetTb4b4b4.Te6edf3decodedTb4b4b4.Te6edf3payloadTb4b4b4.Te6edf3toByteArrayTb4b4b4(Tb4b4b4)
Te6edf3result Tff7b72=
Tff7b72try Tb4b4b4{
Tff7b72when Tb4b4b4(Te6edf3portnumTb4b4b4) Tb4b4b4{
Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APP_VALUETb4b4b4,
Te6edf3PortNumTb4b4b4.Te6edf3ALERT_APP_VALUETb4b4b4,
Tff7b72-Tff7b72> Te6edf3payloadTb4b4b4.Te6edf3toStringTb4b4b4(Te6edf3CharsetsTb4b4b4.Te6edf3UTF_8Tb4b4b4)
Te6edf3PortNumTb4b4b4.Te6edf3POSITION_APP_VALUE Tff7b72-Tff7b72> Te6edf3MeshProtosTb4b4b4.Te6edf3PositionTb4b4b4.Te6edf3parseFromTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)
Te6edf3PortNumTb4b4b4.Te6edf3WAYPOINT_APP_VALUE Tff7b72-Tff7b72> Te6edf3MeshProtosTb4b4b4.Te6edf3WaypointTb4b4b4.Te6edf3parseFromTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)
Te6edf3PortNumTb4b4b4.Te6edf3NODEINFO_APP_VALUE Tff7b72-Tff7b72> Te6edf3MeshProtosTb4b4b4.Te6edf3UserTb4b4b4.Te6edf3parseFromTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)
Te6edf3PortNumTb4b4b4.Te6edf3TELEMETRY_APP_VALUE Tff7b72-Tff7b72> Te6edf3TelemetryProtosTb4b4b4.Te6edf3TelemetryTb4b4b4.Te6edf3parseFromTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)
Te6edf3PortNumTb4b4b4.Te6edf3ROUTING_APP_VALUE Tff7b72-Tff7b72> Te6edf3MeshProtosTb4b4b4.Te6edf3RoutingTb4b4b4.Te6edf3parseFromTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)
Te6edf3PortNumTb4b4b4.Te6edf3ADMIN_APP_VALUE Tff7b72-Tff7b72> Te6edf3AdminProtosTb4b4b4.Te6edf3AdminMessageTb4b4b4.Te6edf3parseFromTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)
Te6edf3PortNumTb4b4b4.Te6edf3PAXCOUNTER_APP_VALUE Tff7b72-Tff7b72> Te6edf3PaxcountProtosTb4b4b4.Te6edf3PaxcountTb4b4b4.Te6edf3parseFromTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)
Te6edf3PortNumTb4b4b4.Te6edf3STORE_FORWARD_APP_VALUE Tff7b72-Tff7b72>
Te6edf3StoreAndForwardProtosTb4b4b4.Te6edf3StoreAndForwardTb4b4b4.Te6edf3parseFromTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)
Te6edf3PortNumTb4b4b4.Te6edf3NEIGHBORINFO_APP_VALUE Tff7b72-Tff7b72> Te6edf3decodeNeighborInfoTb4b4b4(Te6edf3payloadTb4b4b4)
Te6edf3PortNumTb4b4b4.Te6edf3TRACEROUTE_APP_VALUE Tff7b72-Tff7b72> Te6edf3decodeTracerouteTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3payloadTb4b4b4)
Tff7b72else Tff7b72-Tff7b72> Te6edf3payloadTb4b4b4.Te6edf3joinToStringTb4b4b4(Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4) Tb4b4b4{ Te6edf3HEX_FORMATTb4b4b4.Te6edf3formatTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3InvalidProtocolBufferExceptionTb4b4b4) Tb4b4b4{
Ta5d6ff"Ta5d6ffFailed to decode payload: Tffd700${Te6edf3eTb4b4b4.Te6edf3messageTffd700}Ta5d6ff"
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3result
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffformatNodeWithShortNameTb4b4b4(Te6edf3nodeNumTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72val Te6edf3user Tff7b72= Te6edf3nodeRepositoryTb4b4b4.Te6edf3nodeDBbyNumTb4b4b4.Te6edf3valueTff7b72[Te6edf3nodeNumTff7b72]Tff7b72?.Te6edf3user
Tff7b72val Te6edf3shortName Tff7b72= Te6edf3userTff7b72?.Te6edf3shortNameTff7b72?.Te6edf3takeIf Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4) Tb4b4b4} Tff7b72?: Ta5d6ff"Ta5d6ff"
Tff7b72val Te6edf3nodeId Tff7b72= Ta5d6ff"Ta5d6ff!%08xTa5d6ff"Tb4b4b4.Te6edf3formatTb4b4b4(Te6edf3nodeNumTb4b4b4)
Tff7b72return Tff7b72if Tb4b4b4(Te6edf3shortNameTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Ta5d6ff"Tffd700$Te6edf3nodeIdTa5d6ff (Tffd700$Te6edf3shortNameTa5d6ff)Ta5d6ff" Tff7b72else Te6edf3nodeId
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffdecodeNeighborInfoTb4b4b4(Te6edf3payloadTb4b4b4: Te6edf3ByteArrayTb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72val Te6edf3info Tff7b72= Te6edf3MeshProtosTb4b4b4.Te6edf3NeighborInfoTb4b4b4.Te6edf3parseFromTb4b4b4(Te6edf3payloadTb4b4b4)
Tff7b72return Te6edf3buildString Tb4b4b4{
Te6edf3appendLineTb4b4b4(Ta5d6ff"Ta5d6ffNeighborInfo:Ta5d6ff"Tb4b4b4)
Te6edf3appendLineTb4b4b4(Ta5d6ff"Ta5d6ff node_id: Tffd700${Te6edf3formatNodeWithShortNameTb4b4b4(Te6edf3infoTb4b4b4.Te6edf3nodeIdTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Te6edf3appendLineTb4b4b4(Ta5d6ff"Ta5d6ff last_sent_by_id: Tffd700${Te6edf3formatNodeWithShortNameTb4b4b4(Te6edf3infoTb4b4b4.Te6edf3lastSentByIdTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Te6edf3appendLineTb4b4b4(Ta5d6ff"Ta5d6ff node_broadcast_interval_secs: Tffd700${Te6edf3infoTb4b4b4.Te6edf3nodeBroadcastIntervalSecsTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3infoTb4b4b4.Te6edf3neighborsCount Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3appendLineTb4b4b4(Ta5d6ff"Ta5d6ff neighbors:Ta5d6ff"Tb4b4b4)
Te6edf3infoTb4b4b4.Te6edf3neighborsListTb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3n Tff7b72-Tff7b72>
Te6edf3appendLineTb4b4b4(Ta5d6ff"Ta5d6ff - node_id: Tffd700${Te6edf3formatNodeWithShortNameTb4b4b4(Te6edf3nTb4b4b4.Te6edf3nodeIdTb4b4b4)Tffd700}Ta5d6ff snr: Tffd700${Te6edf3nTb4b4b4.Te6edf3snrTffd700}Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffdecodeTracerouteTb4b4b4(Te6edf3packetTb4b4b4: Te6edf3MeshProtosTb4b4b4.Te6edf3MeshPacketTb4b4b4, Te6edf3payloadTb4b4b4: Te6edf3ByteArrayTb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72val Te6edf3getUsernameTb4b4b4: Tb4b4b4(Tffa657IntTb4b4b4) Tff7b72-Tff7b72> Tffa657String Tff7b72= Tb4b4b4{ Te6edf3nodeNum Tff7b72-Tff7b72> Te6edf3formatNodeWithShortNameTb4b4b4(Te6edf3nodeNumTb4b4b4) Tb4b4b4}
Tff7b72return Te6edf3packetTb4b4b4.Te6edf3getTracerouteResponseTb4b4b4(Te6edf3getUsernameTb4b4b4)
Tff7b72?: Te6edf3runCatching Tb4b4b4{ Te6edf3MeshProtosTb4b4b4.Te6edf3RouteDiscoveryTb4b4b4.Te6edf3parseFromTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4.Te6edf3getOrNullTb4b4b4(Tb4b4b4)
Tff7b72?: Te6edf3payloadTb4b4b4.Te6edf3joinToStringTb4b4b4(Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4) Tb4b4b4{ Te6edf3HEX_FORMATTb4b4b4.Te6edf3formatTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.2 - Generated in 0.09s